/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * File Name          : freertos.c
  * Description        : Code for freertos applications
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2024 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */

/* Includes ------------------------------------------------------------------*/
#include "FreeRTOS.h"
#include "task.h"
#include "main.h"
#include "cmsis_os.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "usart.h"
#include "string.h"
#include "stdio.h"

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
#define RX_BUFFER_SIZE 10

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
// 函数指针类型
typedef void (*ActionFunction)();
// 模拟操作函数
void action1() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xFF\x61",14,HAL_MAX_DELAY); }// FF 61
void action2() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x53",14,HAL_MAX_DELAY); }// 00 53
void action3() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xFF\x49",14,HAL_MAX_DELAY); }// FF 49
void action4() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x1F\x41",14,HAL_MAX_DELAY); }// 1F 41
void action5() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xFF\x37",14,HAL_MAX_DELAY); }// FF 37
void action6() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x30",14,HAL_MAX_DELAY); }// 00 30
void action7() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x0F\x25",14,HAL_MAX_DELAY); }// 0F 25
void action8() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xFF\x19",14,HAL_MAX_DELAY); }// FF 19
void action9() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x12",14,HAL_MAX_DELAY); }// 00 12
void action10() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xFF\x08",14,HAL_MAX_DELAY); }// FF 08
void action11() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xF0\x24",14,HAL_MAX_DELAY); }// F0 24
void action12() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xF0\x23",14,HAL_MAX_DELAY); }// F0 23
void action13() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xFF\x60",14,HAL_MAX_DELAY); }// FF 60
void action14() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xFF\x59",14,HAL_MAX_DELAY); }// FF 59
void action15() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x50",14,HAL_MAX_DELAY); }// 00 50
void action16() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xFF\x56",14,HAL_MAX_DELAY); }// FF 56
void action17() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x47",14,HAL_MAX_DELAY); }// 00 47
void action18() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x40",14,HAL_MAX_DELAY); }// 00 40
void action19() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xFF\x29",14,HAL_MAX_DELAY); }// FF 29
void action20() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x35",14,HAL_MAX_DELAY); }// 00 35
void action21() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x23",14,HAL_MAX_DELAY); }// 00 23
void action22() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xFF\x08",14,HAL_MAX_DELAY); }// FF 08
void action23() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x43",14,HAL_MAX_DELAY); }// 00 43
void action24() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xFF\x54",14,HAL_MAX_DELAY); }// FF 54
void action25() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xFF\x39",14,HAL_MAX_DELAY); }// FF 39
void action26() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x21",14,HAL_MAX_DELAY); }// 00 21
void action27() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xFF\x18",14,HAL_MAX_DELAY); }// FF 18
void action28() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x10",14,HAL_MAX_DELAY); }// 00 10
void action29() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xFF\x07",14,HAL_MAX_DELAY); }// FF 07
void action30() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xFF\x52",14,HAL_MAX_DELAY); }// FF 52
void action31() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x42",14,HAL_MAX_DELAY); }// 00 42
void action32() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xFF\x30",14,HAL_MAX_DELAY); }// FF 30
void action33() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xFF\x28",14,HAL_MAX_DELAY); }// FF 28
void action34() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xFF\x17",14,HAL_MAX_DELAY); }// FF 17
void action35() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xFF\x40",14,HAL_MAX_DELAY); }// FF 40
void action36() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xF0\x39",14,HAL_MAX_DELAY); }// F0 39
void action37() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xFF\x51",14,HAL_MAX_DELAY); }// FF 51
void action38() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x38",14,HAL_MAX_DELAY); }// 00 38
void action39() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x0F\x30",14,HAL_MAX_DELAY); }// 0F 30
void action40() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x20",14,HAL_MAX_DELAY); }// 00 20
void action41() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xFF\x48",14,HAL_MAX_DELAY); }// FF 48
void action42() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xFF\x46",14,HAL_MAX_DELAY); }// FF 46
void action43() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x37",14,HAL_MAX_DELAY); }// 00 37
void action44() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xFF\x26",14,HAL_MAX_DELAY); }// FF 26
void action45() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xFF\x16",14,HAL_MAX_DELAY); }// FF 16
void action46() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x07",14,HAL_MAX_DELAY); }// 00 07
void action47() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xFF\x43",14,HAL_MAX_DELAY); }// FF 43
void action48() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xFF\x35",14,HAL_MAX_DELAY); }// FF 25
void action49() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x0F\x30",14,HAL_MAX_DELAY); }// 0F 30
void action50() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x33",14,HAL_MAX_DELAY); }// 00 33
void action51() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x49",14,HAL_MAX_DELAY); }// 00 49
void action52() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x25",14,HAL_MAX_DELAY); }// 00 25
void action53() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xA0\x32",14,HAL_MAX_DELAY); }// A0 32
void action54() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x24",14,HAL_MAX_DELAY); }// 00 24
void action55() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x7F\x06",14,HAL_MAX_DELAY); }// 7F 06
void action56() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x0F\x28",14,HAL_MAX_DELAY); }// 0F 28
void action57() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x0F\x40",14,HAL_MAX_DELAY); }// 0F 40
void action58() { HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x80\x36",14,HAL_MAX_DELAY); }// 80 36
// 键值对结构体
typedef struct {
    int key1;
    int key2;
    ActionFunction action;
} ActionMapping;

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN Variables */
uint8_t rxBuffer[RX_BUFFER_SIZE];
uint8_t rxIndex = 0;
char*str_ptr = NULL;

uint8_t sigFlag = 0;
uint16_t Vrms = 1000;
uint8_t AMdeep = 30;
uint8_t delay = 200;
uint8_t weak = 20;
uint8_t freqM = 30;
uint8_t phase = 0;
uint8_t modeFlag = 0;

char tx_buf[100];
uint8_t fpga_data_flag = 0;
char fg_buf[100];

// 定义键值对和对应的操作 key1:Vrms,key2:freqM
ActionMapping actionMappings[] = {
    {1000,40,action1},{900, 40,action2},{800, 40,action3},{700, 40,action4},{600, 40,action5},{500, 40,action6},{400, 40,action7},{300, 40,action8},{200, 40,action9},{100, 40,action10},
    {1000,39,action13},{900, 39,action2},{800, 39,action3},{700, 39,action57},{600, 39,action58},{500, 39,action6},{400, 39,action54},{300, 39,action8},{200, 39,action9},{100, 39,action10},
    {1000,38,action14},{900, 38,action2},{800, 38,action3},{700, 38,action18},{600, 38,action20},{500, 38,action19},{400, 38,action21},{300, 38,action8},{200, 38,action9},{100, 38,action10},
    {1000,37,action16},{900, 37,action15},{800, 37,action17},{700, 37,action18},{600, 37,action20},{500, 37,action19},{400, 37,action21},{300, 37,action8},{200, 37,action9},{100, 37,action22},
    {1000,36,action24},{900, 36,action3},{800, 36,action23},{700, 36,action25},{600, 36,action50},{500, 36,action19},{400, 36,action26},{300, 36,action27},{200, 36,action28},{100, 36,action29},
    {1000,35,action30},{900, 35,action3},{800, 35,action31},{700, 35,action36},{600, 35,action32},{500, 35,action33},{400, 35,action26},{300, 35,action34},{200, 35,action28},{100, 35,action29},
    {1000,34,action37},{900, 34,action51},{800, 34,action18},{700, 34,action38},{600, 34,action39},{500, 34,action56},{400, 34,action40},{300, 34,action34},{200, 34,action28},{100, 34,action29},
    {1000,33,action15},{900, 33,action42},{800, 33,action18},{700, 33,action43},{600, 33,action6},{500, 33,action44},{400, 33,action40},{300, 33,action45},{200, 33,action28},{100, 33,action46},
    {1000,32,action15},{900, 32,action47},{800, 32,action25},{700, 32,action20},{600, 32,action6},{500, 32,action52},{400, 32,action40},{300, 32,action45},{200, 32,action28},{100, 32,action46},
    {1000,31,action15},{900, 31,action47},{800, 31,action25},{700, 31,action20},{600, 31,action6},{500, 31,action52},{400, 31,action40},{300, 31,action45},{200, 31,action28},{100, 31,action46},
    {1000,30,action41},{900, 30,action35},{800, 30,action25},{700, 30,action53},{600, 30,action19},{500, 30,action54},{400, 30,action40},{300, 30,action45},{200, 30,action28},{100, 30,action55}
};
/* USER CODE END Variables */
/* Definitions for defaultTask */
osThreadId_t defaultTaskHandle;
const osThreadAttr_t defaultTask_attributes = {
  .name = "defaultTask",
  .stack_size = 128 * 4,
  .priority = (osPriority_t) osPriorityNormal,
};
/* Definitions for usTask */
osThreadId_t usTaskHandle;
const osThreadAttr_t usTask_attributes = {
  .name = "usTask",
  .stack_size = 128 * 4,
  .priority = (osPriority_t) osPriorityLow,
};
/* Definitions for fpgaTask */
osThreadId_t fpgaTaskHandle;
const osThreadAttr_t fpgaTask_attributes = {
  .name = "fpgaTask",
  .stack_size = 128 * 4,
  .priority = (osPriority_t) osPriorityLow,
};

/* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN FunctionPrototypes */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if (huart->Instance == UART7)
    {
        if (rxBuffer[rxIndex] == 0x0d || rxBuffer[rxIndex] == 0x0a) // 判断是否接收到换行符
        {
            // handle buf
            str_ptr = strstr((const char*)&rxBuffer,"CWT");
            if(str_ptr != NULL) {
              sigFlag|=0x01;
              modeFlag = 1;
            }

            str_ptr = strstr((const char*)&rxBuffer,"AM");
            if(str_ptr != NULL) {
              sigFlag|=0x02;
              modeFlag = 0;
            }

            str_ptr = strstr((const char*)&rxBuffer,"V+");
            if(str_ptr != NULL) {
              fpga_data_flag|=0x01;
              Vrms = Vrms + 100;
              if(Vrms > 1000)
                Vrms = 1000;
            }

            str_ptr = strstr((const char*)&rxBuffer,"V-");
            if(str_ptr != NULL) {
              fpga_data_flag|=0x01;
              Vrms = Vrms - 100;
              if(Vrms < 100)
                Vrms = 100;
            }

            str_ptr = strstr((const char*)&rxBuffer,"M+");
            if(str_ptr != NULL) {
              fpga_data_flag|=0x02;
              AMdeep = AMdeep + 10;
              if(AMdeep>90)
                AMdeep = 90;
            }

            str_ptr = strstr((const char*)&rxBuffer,"M-");
            if(str_ptr != NULL) {
              fpga_data_flag|=0x02;
              AMdeep = AMdeep - 10;
              if(AMdeep<30)
                AMdeep = 30;
            }

            str_ptr = strstr((const char*)&rxBuffer,"S+");
            if(str_ptr != NULL) {
              fpga_data_flag|=0x04;
              weak = weak%20 + 2;
            }

            str_ptr = strstr((const char*)&rxBuffer,"S-");
            if(str_ptr != NULL) {
              fpga_data_flag|=0x04;
              if(weak>=2)
                weak = weak - 2;
            }

            str_ptr = strstr((const char*)&rxBuffer,"T+");
            if(str_ptr != NULL) {
              fpga_data_flag|=0x08;
              delay = delay + 30;
              if(delay > 200) 
                delay = 200;
            }

            str_ptr = strstr((const char*)&rxBuffer,"T-");
            if(str_ptr != NULL) {
              fpga_data_flag|=0x08;
              delay = delay - 30;
              if(delay < 50)
                delay = 50;
            }

            str_ptr = strstr((const char*)&rxBuffer,"F+");
            if(str_ptr != NULL) {
              fpga_data_flag|=0x10;
              freqM = freqM + 1;
              if(freqM > 40)
                freqM = 40;
            }

            str_ptr = strstr((const char*)&rxBuffer,"F-");
            if(str_ptr != NULL) {
              fpga_data_flag|=0x10;
              freqM = freqM - 1;
              if(freqM < 30)
                freqM = 30;
            }

            str_ptr = strstr((const char*)&rxBuffer,"P+");
            if(str_ptr != NULL) {
              fpga_data_flag|=0x20;
              phase = phase + 30;
              if(phase > 180)
                phase = 180;
            }

            str_ptr = strstr((const char*)&rxBuffer,"P-");
            if(str_ptr != NULL) {
              fpga_data_flag|=0x20;
              if(phase >= 30)
                phase = phase - 30;
            }

            memset(rxBuffer,0,sizeof(rxBuffer));
            rxIndex = 0; // 重置索引
            str_ptr = NULL;
            sigFlag|=0x04;
        }
        else
        {
            rxIndex++; // 继续存储接收到的字符
            if (rxIndex >= RX_BUFFER_SIZE) // prevent overflow
            {
                rxIndex = 0;
            }
        }

        // 再次启动接收中断
        HAL_UART_Receive_IT(huart, &rxBuffer[rxIndex], 1);
    }
}

// 查找并执行操作的函数 key1:Vrms,key2:freqM
void executeAction(int key1, int key2, ActionMapping actionMappings[], int size) {
    int found = 0;
    for (int i = 0; i < size; i++) {
        if (actionMappings[i].key1 == key1 && actionMappings[i].key2 == key2) {
            actionMappings[i].action();
            found = 1;
            break;
        }
    }
    if (!found) {
        HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_0);
    }
}
/* USER CODE END FunctionPrototypes */

void StartDefaultTask(void *argument);
void StartusTask(void *argument);
void StartfpgaTask(void *argument);

void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */

/**
  * @brief  FreeRTOS initialization
  * @param  None
  * @retval None
  */
void MX_FREERTOS_Init(void) {
  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* USER CODE BEGIN RTOS_MUTEX */
  /* add mutexes, ... */
  /* USER CODE END RTOS_MUTEX */

  /* USER CODE BEGIN RTOS_SEMAPHORES */
  /* add semaphores, ... */
  /* USER CODE END RTOS_SEMAPHORES */

  /* USER CODE BEGIN RTOS_TIMERS */
  /* start timers, add new ones, ... */
  /* USER CODE END RTOS_TIMERS */

  /* USER CODE BEGIN RTOS_QUEUES */
  /* add queues, ... */
  /* USER CODE END RTOS_QUEUES */

  /* Create the thread(s) */
  /* creation of defaultTask */
  defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);

  /* creation of usTask */
  usTaskHandle = osThreadNew(StartusTask, NULL, &usTask_attributes);

  /* creation of fpgaTask */
  fpgaTaskHandle = osThreadNew(StartfpgaTask, NULL, &fpgaTask_attributes);

  /* USER CODE BEGIN RTOS_THREADS */
  /* add threads, ... */
  /* USER CODE END RTOS_THREADS */

  /* USER CODE BEGIN RTOS_EVENTS */
  /* add events, ... */
  /* USER CODE END RTOS_EVENTS */

}

/* USER CODE BEGIN Header_StartDefaultTask */
/**
  * @brief  Function implementing the defaultTask thread.
  * @param  argument: Not used
  * @retval None
  */
/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void *argument)
{
  /* USER CODE BEGIN StartDefaultTask */
  HAL_UART_Receive_IT(&huart7, &rxBuffer[rxIndex], 1);
  HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xFF\x48",14,HAL_MAX_DELAY);// 初始化幅值
  osDelay(1);
  HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x08\x00",14,HAL_MAX_DELAY);// 延时200ns
  osDelay(1);
  HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\xCD\x0C",14,HAL_MAX_DELAY);// 初始化20dB
  /* Infinite loop */
  for(;;)
  {
    osDelay(1000);
    HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_0);
  }
  /* USER CODE END StartDefaultTask */
}

/* USER CODE BEGIN Header_StartusTask */
/**
* @brief Function implementing the usTask thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartusTask */
void StartusTask(void *argument)
{
  /* USER CODE BEGIN StartusTask */
  osDelay(200);
  /* Infinite loop */
  for(;;)
  {
    osDelay(200);
    if(sigFlag&0x04) { // 串口屏显示更新任务
      if(modeFlag) {
        sprintf(tx_buf,"t16.txt=\"CW\"\xff\xff\xff");
        HAL_UART_Transmit(&huart7,(const uint8_t*)tx_buf,strlen(tx_buf),HAL_MAX_DELAY);
      } else {
        sprintf(tx_buf,"t16.txt=\"AM\"\xff\xff\xff");
        HAL_UART_Transmit(&huart7,(const uint8_t*)tx_buf,strlen(tx_buf),HAL_MAX_DELAY);
      }
      sprintf(tx_buf,"t2.txt=\"%d\"\xff\xff\xff",Vrms);
      HAL_UART_Transmit(&huart7,(const uint8_t*)tx_buf,strlen(tx_buf),HAL_MAX_DELAY);
      osDelay(1);
      sprintf(tx_buf,"t5.txt=\"%d\"\xff\xff\xff",AMdeep);
      HAL_UART_Transmit(&huart7,(const uint8_t*)tx_buf,strlen(tx_buf),HAL_MAX_DELAY);
      osDelay(1);
      sprintf(tx_buf,"t8.txt=\"%d\"\xff\xff\xff",weak);
      HAL_UART_Transmit(&huart7,(const uint8_t*)tx_buf,strlen(tx_buf),HAL_MAX_DELAY);
      osDelay(1);
      sprintf(tx_buf,"t11.txt=\"%d\"\xff\xff\xff",delay);
      HAL_UART_Transmit(&huart7,(const uint8_t*)tx_buf,strlen(tx_buf),HAL_MAX_DELAY);
      osDelay(1);
      sprintf(tx_buf,"t14.txt=\"%d\"\xff\xff\xff",freqM);
      HAL_UART_Transmit(&huart7,(const uint8_t*)tx_buf,strlen(tx_buf),HAL_MAX_DELAY);
      osDelay(1);
      sprintf(tx_buf,"t18.txt=\"%d\"\xff\xff\xff",phase);
      HAL_UART_Transmit(&huart7,(const uint8_t*)tx_buf,strlen(tx_buf),HAL_MAX_DELAY);
      osDelay(1);
      sigFlag&=0xFB;
    }
  }
  /* USER CODE END StartusTask */
}

/* USER CODE BEGIN Header_StartfpgaTask */
/**
* @brief Function implementing the fpgaTask thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartfpgaTask */
void StartfpgaTask(void *argument)
{
  /* USER CODE BEGIN StartfpgaTask */
  int size = sizeof(actionMappings) / sizeof(actionMappings[0]);
  /* Infinite loop */
  for(;;)
  {
    // group1 连续波与调制波改变（已测试）
    if(sigFlag&0x01) {
      HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00",14,HAL_MAX_DELAY);
      sigFlag&=0xFE;
      // sprintf(tx_buf,"t16.txt=\"CW\"\xff\xff\xff");
      // HAL_UART_Transmit(&huart7,(const uint8_t*)tx_buf,strlen(tx_buf),HAL_MAX_DELAY);
    } else if(sigFlag&0x02) {
      HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x01\x00",14,HAL_MAX_DELAY);
      sigFlag&=0xFD;
      // sprintf(tx_buf,"t16.txt=\"AM\"\xff\xff\xff");
      // HAL_UART_Transmit(&huart7,(const uint8_t*)tx_buf,strlen(tx_buf),HAL_MAX_DELAY);
    }
    // group2 电压有效值范围改变（结合group6进行改进）
    if(fpga_data_flag&0x01 || fpga_data_flag&0x10){
      // switch (Vrms)
      // {
      // case 100:
      //   HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x50\x07",14,HAL_MAX_DELAY);
      //   break;
      // case 200:
      //   HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x10",14,HAL_MAX_DELAY);
      //   break;
      // case 300:
      //   HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x16",14,HAL_MAX_DELAY);
      //   break;
      // case 400:
      //   HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x20",14,HAL_MAX_DELAY);
      //   break;
      // case 500:
      //   HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x5E\x24",14,HAL_MAX_DELAY);
      //   break;
      // case 600:
      //   HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xFF\x29",14,HAL_MAX_DELAY);
      //   break;
      // case 700:
      //   HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x10\x33",14,HAL_MAX_DELAY);
      //   break;
      // case 800:
      //   HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xFF\x39",14,HAL_MAX_DELAY);
      //   break;
      // case 900:
      //   HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x42",14,HAL_MAX_DELAY);
      //   break;
      // case 1000:
      //   HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\xFF\x48",14,HAL_MAX_DELAY);
      //   break;
      // default:
      //   HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);
      //   break;
      // }
      executeAction(Vrms,freqM,actionMappings,size);
      fpga_data_flag&=0xFE;
    }
    // group3 调制深度改变（已测试）
    if(fpga_data_flag&0x02){
      switch (AMdeep)
      {
      case 30:
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xAB\x6A",14,HAL_MAX_DELAY);
        break;
      case 40:
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x50",14,HAL_MAX_DELAY);
        break;
      case 50:
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x40",14,HAL_MAX_DELAY);
        break;
      case 60:
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x55\x35",14,HAL_MAX_DELAY);
        break;
      case 70:
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xB7\x2D",14,HAL_MAX_DELAY);
        break;
      case 80:
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x28",14,HAL_MAX_DELAY);
        break;
      case 90:
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xAF\x21",14,HAL_MAX_DELAY);
        break;
      default:
        HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);
        break;
      }
      fpga_data_flag&=0xFD;
    }
    // group4 幅值衰减改变
    if(fpga_data_flag&0x04){
      switch (weak)
      {
      case 0:
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x80",14,HAL_MAX_DELAY);
        break;
      case 2:
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\xAD\x65",14,HAL_MAX_DELAY);
        break;
      case 4:
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\xC4\x50",14,HAL_MAX_DELAY);
        break;
      case 6:
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x29\x40",14,HAL_MAX_DELAY);
        break;
      case 8:
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\xFA\x32",14,HAL_MAX_DELAY);
        break;
      case 10:
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x7A\x28",14,HAL_MAX_DELAY);
        break;
      case 12:
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x27\x20",14,HAL_MAX_DELAY);
        break;
      case 14:
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x81\x19",14,HAL_MAX_DELAY);
        break;
      case 16:
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x49\x14",14,HAL_MAX_DELAY);
        break;
      case 18:
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x1F\x10",14,HAL_MAX_DELAY);
        break;
      case 20:
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\xCD\x0C",14,HAL_MAX_DELAY);
        break;
      default:
        HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);
        break;
      }
      fpga_data_flag&=0xFB;
    }
    // group5 延时改变（已测试）
    if(fpga_data_flag&0x08){
      switch (delay)
      {
      case 50:
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x08\x00",14,HAL_MAX_DELAY);
        break;
      case 80:
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x0D\x00",14,HAL_MAX_DELAY);
        break;
      case 110:
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x12\x00",14,HAL_MAX_DELAY);
        break;
      case 140:
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x16\x00",14,HAL_MAX_DELAY);
        break;
      case 170:
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x1C\x00",14,HAL_MAX_DELAY);
        break;
      case 200:
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x20\x00",14,HAL_MAX_DELAY);
        break;
      default:
        HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);
        break;
      }
      fpga_data_flag&=0xF7;
    }
    // group6 频率改变（已测试）
    if(fpga_data_flag&0x10){
      switch (freqM)
      {
      case 30:
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x42\x2F",14,HAL_MAX_DELAY);
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x2F\xF4",14,HAL_MAX_DELAY);
        break;
      case 31:
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\xD6\x30",14,HAL_MAX_DELAY);
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x97\x40",14,HAL_MAX_DELAY);
        break;
      case 32:
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x69\x32",14,HAL_MAX_DELAY);
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\xFF\x8C",14,HAL_MAX_DELAY);
        break;
      case 33:
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\xFC\x33",14,HAL_MAX_DELAY);
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x67\xD9",14,HAL_MAX_DELAY);
        break;
      case 34:
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x90\x35",14,HAL_MAX_DELAY);
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\xCF\x25",14,HAL_MAX_DELAY);
        break;
      case 35:
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x23\x37",14,HAL_MAX_DELAY);
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x37\x72",14,HAL_MAX_DELAY);
        break;
      case 36:
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\xB6\x38",14,HAL_MAX_DELAY);
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x9F\xBE",14,HAL_MAX_DELAY);
        break;
      case 37:
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x4A\x3A",14,HAL_MAX_DELAY);
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x0B\x07",14,HAL_MAX_DELAY);
        break;
      case 38:
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\xDD\x3B",14,HAL_MAX_DELAY);
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x6F\x57",14,HAL_MAX_DELAY);
        break;
      case 39:
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x70\x3D",14,HAL_MAX_DELAY);
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\xD7\xA3",14,HAL_MAX_DELAY);
        break;
      case 40:
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x05\x00\x03\x3F",14,HAL_MAX_DELAY);
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x06\x00\x3F\xF0",14,HAL_MAX_DELAY);
        break;
      default:
        HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);
        break;
      }
      fpga_data_flag&=0xEF;
    }
    // group7 相位改变
    if(fpga_data_flag&0x20){
      switch (phase)
      {
      case 0:
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00",14,HAL_MAX_DELAY);
        break;
      case 30:
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x15",14,HAL_MAX_DELAY);
        break;
      case 60:
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x29",14,HAL_MAX_DELAY);
        break;
      case 90:
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x45",14,HAL_MAX_DELAY);
        break;
      case 120:
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x58",14,HAL_MAX_DELAY);
        break;
      case 150:
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x70",14,HAL_MAX_DELAY);
        break;
      case 180:
        HAL_UART_Transmit(&huart5,(const uint8_t*)"\x7E\x7E\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\xB0",14,HAL_MAX_DELAY);
        break;
      default:
        HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);
        break;
      }
      fpga_data_flag&=0xDF;
    }
    osDelay(200);
  }
  /* USER CODE END StartfpgaTask */
}

/* Private application code --------------------------------------------------*/
/* USER CODE BEGIN Application */

/* USER CODE END Application */

